home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Magazine / Morphos / GCC / os-includeppc / inline / strsup.h < prev    next >
C/C++ Source or Header  |  1997-04-14  |  3KB  |  199 lines

  1. #if !defined(_STRSUP_H) && defined(__OPTIMIZE__)
  2.  
  3. #define _STRSUP_H
  4.  
  5. #include <sys/types.h>
  6.  
  7. static __inline__ void _CopyMem(void *source,void *dest,size_t size)
  8. {
  9.   register char *a6 __asm("a6") = *(char **)4;
  10.   register void *a0 __asm("a0") = source;
  11.   register void *a1 __asm("a1") = dest;
  12.   register size_t d0 __asm("d0") = size;
  13.   __asm __volatile ("jsr a6@(-0x270)"
  14.   : /* no output */
  15.   : "r" (a6), "r" (a0), "r" (a1), "r" (d0)
  16.   : "a0","a1","d0","d1", "memory");
  17. }
  18.  
  19. extern __inline__ void *memcpy(void *s1,const void *s2,size_t n)
  20. {
  21.   _CopyMem((void *)s2,(void *)s1,n); return s1;
  22. }
  23.  
  24. extern __inline__ void *memmove(void *s1,const void *s2,size_t n)
  25.   bcopy(s2,s1,n); return s1;
  26. }
  27.  
  28. extern __inline__ void *memset(void *s,int c,size_t n)
  29.   if (n != 0)
  30.   {
  31.     unsigned char *p=s;
  32.     do
  33.     {
  34.       *p++=c;
  35.     }while(--n != 0);
  36.   }
  37.   return s;
  38. }
  39.  
  40. extern __inline__ void *memchr(const void *s,int c,size_t n)
  41. {
  42.   if (n != 0)
  43.   {
  44.     unsigned char *p=(unsigned char *)s;
  45.     do
  46.     {
  47.       if (*p++==(unsigned char)c)
  48.         return --p;
  49.     }while(--n != 0);
  50.   }
  51.   return (void *)n;
  52. }
  53.  
  54. extern __inline__ size_t strlen_plus_one(const char *string)
  55. {
  56.   const char *s=string;
  57.  
  58.   while(*s++)
  59.     ;
  60.   return (s-string);
  61. }
  62.  
  63. extern __inline__ size_t strlen(const char *string)
  64. {
  65.   const char *s=string;
  66.  
  67.   while(*s++)
  68.     ;
  69.   return ~(string-s);
  70. }
  71.  
  72. extern __inline__ char *strcpy(char *s1,const char *s2)
  73. { char *s=s1;
  74.   do
  75.     *s++=*s2;
  76.   while(*s2++!='\0');
  77.   return s1;
  78. }
  79.  
  80. extern __inline__ char *strncpy(char *s1,const char *s2,size_t n)
  81. {
  82.   if (n != 0)
  83.   {
  84.     char *s=s1;
  85.  
  86.     while ((*s++=*s2++) && (--n != 0))
  87.       ;
  88.     if (n != 0)
  89.     {
  90.       do
  91.         *s++=0;
  92.       while (--n != 0);
  93.     }
  94.   }
  95.   return s1;
  96. }
  97.  
  98. extern __inline__ char *strcat(char *s1,const char *s2)
  99.   char *s=s1;
  100.  
  101.   while(*s++)
  102.     ;
  103.   --s;
  104.   while((*s++=*s2++))
  105.     ;
  106.   return s1;
  107. }
  108.  
  109. extern __inline__ char *strncat(char *s1,const char *s2,size_t n)
  110. {
  111.   if (n != 0)
  112.   {
  113.     char *s=s1;
  114.  
  115.     while(*s++)
  116.       ;
  117.  
  118.     --s;
  119.  
  120.     for(;;)
  121.     {
  122.       if(!(*s++=*s2++))
  123.         return s1;
  124.       if(!--n)
  125.       { *s=0;
  126.         return s1; }
  127.     }
  128.   }
  129.   return s1;
  130.  
  131. extern __inline__ int strcmp(const char *s1,const char *s2)
  132.   int r;
  133.   
  134.   while (!(r=*s1++-*s2) && *s2++)
  135.     ;
  136.  
  137.   return r;
  138. }
  139.  
  140. extern __inline__ int strncmp(const char *s1,const char *s2,size_t n)
  141.   int r=0;
  142.  
  143.   if (n != 0)
  144.     while (!(r=*s1++-*s2) && *s2++ && (--n != 0))
  145.       ;
  146.  
  147.   return r;
  148. }
  149. #if 0
  150. extern __inline__ char *strchr(const char *s,int c)
  151. {
  152.   while (*s!=(char)c)
  153.     if (!(*s++))
  154.     {
  155.       s=NULL; break;
  156.     }
  157.   return (char *)s;
  158. }
  159. #endif
  160. extern __inline__ char *strupr(char *s)
  161. {
  162.   unsigned char *s1;
  163.  
  164.   s1=(unsigned char *)s;
  165.   while(*s1)
  166.   {
  167.     if ((*s1>('a'-1)) && (*s1<('z'+1)))
  168.       *s1-='a'-'A';
  169.     s1++;
  170.   }
  171.   return s;
  172. }
  173.  
  174. extern __inline__ char *strlwr(char *s)
  175. {
  176.   unsigned char *s1;
  177.  
  178.   s1=(unsigned char *)s;
  179.   while(*s1)
  180.   {
  181.     if ((*s1>('A'-1)) && (*s1<('Z'+1)))
  182.       *s1+='a'-'A';
  183.     s1++;
  184.   }
  185.   return s;
  186. }
  187.  
  188. #elif !defined(__OPTIMIZE__)
  189.  
  190. #define strlen_plus_one(s) strlen(s)+1L
  191.  
  192. #endif /* _STRSUP_H */
  193.